global cargar_tabla_codigo_desde_buffer

;cargar_tabla_codigo_desde_buffer ( unsigned char * buf, unsigned int size, codigo_t **tabla_codigo )

extern printf
extern calloc

%define p_buf ebp+8
%define size_buf ebp+12
%define pp_tabla_codigo ebp+16
%define null 0
%define max_elem 256
%define tamanio_elem 16
%define offset_cant_codigos 8

%define tamanio_header 16
%define tamanio_codificacion_t 9

%define offset_simbolo 0
%define offset_codigo_codificacion_t 1
%define offset_long_codigo_codificacion_t 5


%define offset_codigo_codigo_t 0
%define offset_codigo_rev 4
%define offset_long_codigo_codigo_t 8
%define offset_valido 12

%define valido 1

section .data
error_buffer_null: db 'ERROR: Buffer de origen NULL' ,10,0
error_tabla_codigo: db 'ERROR: Puntero a la tabla de codigo no puede ser NULL' ,10,0

calloc_error: db 'ERROR: Error en CALLOC' ,10,0

section .text
cargar_tabla_codigo_desde_buffer:
	;enter 0,0	 ; comentado para probar con valgrind
	push ebp	
	mov ebp,esp
	
	push ebx
	push esi
	push edi

	mov ebx,[p_buf] ; puntero al buffer
	cmp ebx,null
	jne _seguir
	
_error_buffer_null:
	push error_buffer_null 
	call printf
	add esp,4
	mov eax,-1
	jmp fin
	
_seguir:
	mov esi,[pp_tabla_codigo] ; puntero al puntero a la tabla
	cmp esi,null
	jne _seguir1

_error_tabla_codigo:
	push error_tabla_codigo 
	call printf
	add esp,4
	mov eax,-1
	jmp fin

_seguir1:
	push max_elem
	push tamanio_elem
	call calloc
	add esp,8
	cmp eax,null
	jne _calloc_ok
	push calloc_error
	call printf
	add esp,4
	mov eax,-1
	jmp fin	
	
	
_calloc_ok:
	mov [esi],eax ; guardamos el puntero a la tabla resultado en el contenido de esi.
	mov esi, eax
	
	mov ecx, [size_buf]

_ciclo:
	cmp ecx, 0
	jne _siguiente_codigo
	jmp fin
	
_siguiente_codigo:
	xor edx,edx
	mov dl, [ebx+offset_simbolo]
	shl edx,1
	mov eax, [ebx+offset_codigo_codificacion_t] 
	lea edx, [esi+8*edx]
	mov [edx + offset_codigo_codigo_t], eax

	mov eax, [ebx+offset_long_codigo_codificacion_t]
	mov [edx + offset_long_codigo_codigo_t], eax
	
	mov dword [edx + offset_valido], valido
	
	add ebx, tamanio_codificacion_t
	sub ecx, tamanio_codificacion_t
	jmp _ciclo
	
	xor eax,eax
	
	

fin:
	pop edi
	pop esi
	pop ebx
	leave	

	ret
